inthandler equ * ; interrupt handler
 ifne opers-prodos
 cld
 fin
 lda #0
 sta statparm+1
 ifne opers-pascal
 ldy #<statparm
 ldx #>statparm
 else
 ldy adrstatparm+1
 ldx adrstatparm
 fin
 jsr applebus ; is interrupt from us ?
 bcs srcsckt9 ; not ours, just return
 lda status
 pha
 ldx #zpsize-1 ; save zero page
 lda cmndlist,x
 sta savezp,x
 dex
 bpl *-6
 ifne opers-prodos
 stx intrflag ; indicates we are in interrupt
 fin
 lda statparm+1 ; what kind of interrupt ?
 and #$0f  ; get packet bits
 sta pcktmap ; number of packets
nxtpckt lsr pcktmap ; have we read them all ?
 bcs rdpckt ; no
 bne nxtpckt ; try again if some bit are still set
chktimer bit statparm+1
 bvc intrpdone
 jsr atptimeout
 jsr nbptimeout
 dec bridgetime
 bne chkusrtime
 dec bridgetime+1
 bne chkusrtime
 lda #0
 sta a.bridge
chkusrtime equ *
 lda usertimer+1 ; does user want a timer ?
 beq *+5 ; no
usertimer equ *+1
 jsr $0000
intrpdone ldx #zpsize-1 ; restore zero page
 lda savezp,x
 sta cmndlist,x
 dex
 bpl *-6
 ifne opers-prodos
 inx
 stx intrflag ; indicates we are outside interrupt
 fin
 pla
 sta status ; restore status
 clc
 rts
;
rdpckt equ * ; read the lap part
 ifne opers-pascal
 ldy #<rlapparm
 ldx #>rlapparm
 else
 ldy adrrlapparm+1
 ldx adrrlapparm
 fin
 jsr readheader
 bne nxtpckt ; packete too short, garbage
 lda laptype ; what type ?
 tax
 dex
 beq short
 dex
 beq long
 ldx prtclhandler+1 ; do we have a protocol handler ?
 sec
 beq aftprthandler ; no, since carry is set, will be discarded
 ldx lapsrce ; pass source node in x reg, lap type in acc
prtclhandler equ *+1
 jsr $0000
aftprthandler jmp chkreject ; discard packet if carry flag is set
;
short lda #5
 sta ddphsize
 ifne opers-pascal
 ldy #<rddpparm
 ldx #>rddpparm
 else
 ldy adrrddpparm+1
 ldx adrrddpparm
 fin
 jsr readheader ; read the ddp header
 bne nxtpckt
 do savespace
 ldy #move1-movetable
 jsr movedata
 beq readddp ; since movedata set z flag, bra
 else
 lda ddphead+sd.dsckt
 sta ddphead+ld.dsckt
 lda ddphead+sd.ssckt
 sta ddphead+ld.ssckt
 lda ddphead+sd.protocol
 sta ddphead+ld.protocol
 lda lapdest
 sta ddphead+ld.dnode
 lda lapsrce
 sta ddphead+ld.snode
 lda #0 ; also clear z flag to indicates ok
 sta ddphead+ld.snet
 sta ddphead+ld.snet+1 ; short ddp has the same net number
 beq readddp
 fin
long lda #13
 sta ddphsize
 ifne opers-pascal
 ldy #<rddpparm
 ldx #>rddpparm
 else
 ldy adrrddpparm+1
 ldx adrrddpparm
 fin
 jsr readheader
 do savespace
 bne nxtpckt
 else
 bne reject.1 ; if error try next packet
 fin
 ldx #1 ; filter out wrong net
filternet lda ddphead+ld.dnet,x
 cmp thisnet,x
 bne reject
 dex
 bpl filternet
 lda ddphead+ld.chksum
 ora ddphead+ld.chksum+1
 sta chksmf ; if checksum is not zero, do checksum from now on
 jsr headersum ; calcuate header checksum, note headersum must return z set
readddp lda ddphead+ld.dsckt ; packet for which socket
 beq reject ; type 0 not allowed
 jsr srchscktable ; search the socket table
 bne reject ; not in table, throw it away
 txa
 asl a
 tax
 lda listentable+1,x
 beq reject ; table nil, throw it away now, but add something later
 sta execadr+1
 lda listentable,x
 sta execadr
 ifne opers-pascal
 ldy #<lapdata
 ldx #>lapdata
 else
 ldy adrlapdata+1
 ldx adrlapdata
 fin
 jsr doexecute
chkreject bcc *+5 ; no need to discard if user took care of it
reject jsr discard
reject.1 jmp nxtpckt
;
;
;
readheader jsr applebus ; read the header
 sec
 beq discrd.9 ; ok, return with z and c set
 cmp #2 ; buffer overflow
 beq discrd.9 ; ok, return with z and c set
;bcc discrd.9 ; if =1 not ok, return with z flag clear 
;
carrydiscard equ * ; discard if carry set
 bcc discrd.9 ; the rule is only if carry set
discard equ * ; discard packet
 ifne opers-pascal
 ldy #<rrstparm
 ldx #>rrstparm
 else
 ldy adrrrstparm+1
 ldx adrrrstparm
 fin
 jsr applebus
 lda #1 ; carry was clear, now clear z flag
discrd.9 rts
;
pcktmap dfb 0
;
statparm dfb 4,0
;
rlapparm dfb 5
 dw lapdata
 dw 3
;
rddpparm dfb 5
 dw ddphead
ddphsize dw 5
rrstparm dfb 2
 dw 0
 dfb $ff
rnetparm dfb 5
 dw thisnet,4
 ifeq opers-pascal
adrrlapparm dw rlapparm
adrstatparm dw statparm
adrlapdata dw lapdata
adrrddpparm dw rddpparm
adrrrstparm dw rrstparm
adrrnetparm dw rnetparm
 fin
savezp ds zpsize,0 ; save $40-$47 here
;
 do savespace
movedata equ *
 ldx movetable,y
 beq discrd.9 ; 0 is end marker, done
 lda dataarea,x ; source
 iny
 ldx movetable,y
 sta dataarea,x ; destination
 iny
 bne movedata ; this should be a bra
;
movetable equ *
move1 equ * ; move short header to long header
 dfb ddphead+sd.dsckt-dataarea,ddphead+ld.dsckt-dataarea
 dfb ddphead+sd.ssckt-dataarea,ddphead+ld.ssckt-dataarea
 dfb ddphead+sd.protocol-dataarea,ddphead+ld.protocol-dataarea
 dfb lapdest-dataarea,ddphead+ld.dnode-dataarea
 dfb lapsrce-dataarea,ddphead+ld.snode-dataarea
 dfb const0-dataarea,ddphead+ld.snet-dataarea
 dfb const0-dataarea,ddphead+ld.snet+1-dataarea
 dfb 0 ; end marker
move2 equ * ; make long ddp headr
 dfb const2-dataarea,laptype-dataarea
 dfb ddphead+sd.ssckt-dataarea,ddphead+ld.ssckt-dataarea
 dfb ddphead+sd.dsckt-dataarea,ddphead+ld.dsckt-dataarea
 dfb const16-dataarea,wddpsize-dataarea
 dfb const13-dataarea,ddphead+ld.length+1-dataarea
 dfb lapdest-dataarea,ddphead+ld.dnode-dataarea
 dfb ournode-dataarea,ddphead+ld.snode-dataarea
 dfb thisnet-dataarea,ddphead+ld.snet-dataarea
 dfb thisnet+1-dataarea,ddphead+ld.snet+1-dataarea
 dfb const0-dataarea,ddphead+ld.length-dataarea
 dfb const0-dataarea,ddphead+ld.chksum-dataarea
 dfb const0-dataarea,ddphead+ld.chksum+1-dataarea
;dfb a.bridge-dataarea,lapdest-dataarea
 dfb 0
move3 equ * ; make short ddp header
 dfb const1-dataarea,laptype-dataarea
 dfb ddphead+ld.protocol-dataarea,ddphead+sd.protocol-dataarea
 dfb const0-dataarea,ddphead+sd.length-dataarea
 dfb const5-dataarea,ddphead+sd.length+1-dataarea
 dfb const8-dataarea,wddpsize-dataarea
 dfb const0-dataarea,chksmf-dataarea
 dfb 0
move4 equ * ; make nbp header
 dfb const2-dataarea,ddphead+ld.protocol-dataarea
 dfb const2-dataarea,ddphead+sd.ssckt-dataarea
 dfb const2-dataarea,ddphead+sd.dsckt-dataarea
 dfb const2-dataarea,nbpbuffer+3-dataarea
 dfb thisnet-dataarea,nbpbuffer-dataarea
 dfb thisnet+1-dataarea,nbpbuffer+1-dataarea
 dfb ournode-dataarea,nbpbuffer+2-dataarea
 dfb const0-dataarea,nbpbuffer+4-dataarea
 dfb const0-dataarea,chksmf-dataarea
 dfb 0
 fin
;
;
rtmplisten equ * ; listener for rtmp
 ldx ddphead+ld.protocol ; rtmp is type 1
 dex
 bne rtmp.8 ; not rtmp, discard
 ifne opers-pascal
 ldy #<rnetparm ; read the network number
 ldx #>rnetparm
 else
 ldy adrrnetparm+1 ; read the network number
 ldx adrrnetparm
 fin
 jsr readheader
 bne rtmp.9 ; if error, already discarded, carry clear is right
 lda #361-256
 sta bridgetime
 lda #2
 sta bridgetime+1
rtmp.8 sec  ; disregard everything else
rtmp.9 rts
